package com.aaa.annotations.demo4;


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author C-Q
 * @version 1.1.0
 * @Description: 自定义注解---属性
 *
 * @Tetention：你的注解在什么时候生效
 * source：注解只保留在源文件，当Java文件编译成class文件的时候，注解被遗弃；被编译器忽略
 * class：注解被保留到class文件，但jvm加载class文件时候被遗弃，这是默认的生命周期
 * runtime：注解不仅被保存到class文件中，jvm加载class文件之后，仍然存在
 *
 * 这3个生命周期分别对应于：Java源文件(.java文件) ---> .class文件 ---> 内存中的字节码。
 *
 * 那怎么来选择合适的注解生命周期呢？
 *
 * 首先要明确生命周期长度 SOURCE < CLASS < RUNTIME ，所以前者能作用的地方后者一定也能作用。
 * 一般如果需要在运行时去动态获取注解信息，那只能用 RUNTIME 注解；
 * 如果要在编译时进行一些预处理操作，比如生成一些辅助代码（如 ButterKnife），就用 CLASS注解；
 * 如果只是做一些检查性的操作，比如 @Override 和 @SuppressWarnings，则可选用 SOURCE 注解。
 * @date 2022/10/26
 */
public class Test {
}
/**
 * @author CHENQING
 */
@Target(value = {ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)


    @interface Custom{
         //一旦定义好属性如果该属性没有默认值，那么必须在使用该注解时指定属性的值
        int age() default 18;
        //如果是数组那么在使用该注解时该属性的值使用{}来给定
        String[] hobby();
        Above above();//枚举类型
        Custom01 custom01();//注解类型的属性
    }

    /**
     * @author CHENQING
     */
    @interface Custom01{
        String name();
    }

    @Custom(hobby = {"读书","写字"},above=Above.AGE,custom01=@Custom01(name="老虎"))

    enum Above{
        TYPE,NAME,AGE
    }